home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / kiss-0.11 / kiss-0 / kiss / src / recursiveremove.c < prev    next >
C/C++ Source or Header  |  1995-03-23  |  1KB  |  52 lines

  1. #include "kiss.h"
  2.  
  3. int recursiveremove (char *dir, RmFlags fl)
  4. {
  5.     glob_t
  6.     globres;
  7.     register int
  8.     i,
  9.     res = 0;
  10.     struct stat
  11.     statbuf;
  12.     char
  13.     name [FILENAMELEN];
  14.  
  15.     /* first kill files starting with a dot */
  16.     strcpy (name, dir);
  17.     if (name [strlen (name) - 1] != '/')
  18.     strcat (name, "/");
  19.     strcat (name, ".*");
  20.     if (! glob (name, 0, NULL, &globres))
  21.     /* note: start at index 2, first are . and .. */
  22.     for (i = 2; i < globres.gl_pathc; i++)
  23.         res += removefile (globres.gl_pathv [i], fl);
  24.     globfree (&globres);
  25.  
  26.     /* now kill all other files */
  27.     strcpy (name, dir);
  28.     if (name [strlen (name) - 1] != '/')
  29.     strcat (name, "/");
  30.     strcat (name, "*");
  31.     if (! glob (name, 0, NULL, &globres))
  32.     for (i = 0; i < globres.gl_pathc; i++)
  33.         res += removefile (globres.gl_pathv [i], fl);
  34.  
  35.     /* is dir itself removable? */
  36.     if (stat (dir, &statbuf))
  37.     return (warning ("suddenly can't stat \"%\" no more", dir));
  38.  
  39.     if (! (statbuf.st_mode & S_IWUSR))
  40.     {
  41.     if (! fl.forced)
  42.         return (warning ("dir \"%s\" is non-writeable", dir));
  43.     if (chmod (dir, statbuf.st_mode | S_IWUSR))
  44.         return (warning ("failure removing read-only on dir \"%s\"", dir));
  45.     }
  46.  
  47.     if (rmdir (dir))
  48.     return (warning ("failure removing dir \"%s\"", dir));
  49.  
  50.     return (res);
  51. }
  52.